/*
 * Copyright (c) 2013-2015, thinkjoy Inc. All Rights Reserved.
 * 
 * Project Name: wyt
 * $Id: FileUtils.java 2015年3月19日 下午2:08:06 $ 
 */
package com.jy.app.lib.utils;

import android.content.Context;
import android.media.MediaScannerConnection;
import android.os.Environment;
import android.text.TextUtils;

import com.jy.app.lib.application.BaseApplication;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class FileUtils {
	/**
	 * 
	 * TODO 创建文件目录
	 * 
	 * @author xszhang
	 * @param fileDir
	 * @return
	 * @since v0.0.1
	 */
	public static boolean checkAndMakeDir(String fileDir) {
		File file = new File(fileDir);
		if (!file.exists()) {
			if (file.mkdirs()) {
				return true;
			} else {
				return false;
			}
		} else {
			return true;
		}
	}

	/**
	 * 检测文件是否存在
	 * 
	 * @param path
	 * @return
	 */
	public static boolean isFileExist(String path) {
		try {
			if (!TextUtils.isEmpty(path)) {
				File file = new File(path);
				return file.exists();
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		return false;
	}

	/**
	 * 写数据到SD中的文件
	 * 
	 * @param filePath
	 * @param fileContent
	 */
	public static void writeFileSdcardFile(String filePath, String fileContent) {
		try {

			FileOutputStream fout = new FileOutputStream(filePath);
			byte[] bytes = fileContent.getBytes();
			fout.write(bytes);
			fout.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 读取文件
	 * @param file
	 * @return
	 */
	public static String readFile(File file) {
		BufferedReader reader = null;
		StringBuffer sb = new StringBuffer();
		try {
			reader = new BufferedReader(new FileReader(file));
			String line = null;
			while ((line = reader.readLine()) != null) {  
				sb.append(line).append("\r\n");
            }
		} catch (Exception e) {
			e.printStackTrace();
		} finally {  
            if (reader != null) {  
                try {  
                    reader.close();  
                } catch (IOException e1) {
                	e1.printStackTrace();
                }  
            }  
        }
		return sb.toString();
	}
	/**
	 * 检测SD卡是否存在
	 */
	public static boolean isSDExist() {
		return Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
	}

	/**
	 *
	 * TODO 根据给定的文件的完整路径，判断 并创建文件夹 及文件
	 *
	 * @author xszhang
	 * @param filePath
	 * @return
	 * @since v0.0.1
	 */
	public static boolean createDirAndFile(String filePath) {
		boolean isSuccess = false;
		File file = new File(filePath);
		try {
			if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();
			}
			if (!file.exists()) {
				file.createNewFile();
			}
			isSuccess = true;
		} catch (IOException e) {
			e.printStackTrace();
			isSuccess = false;
		}
		return isSuccess;
	}

	/**
	 * 功能说明:获取系统当期时间
	 * <p>
	 * getTime
	 * </p>
	 *
	 * @return
	 */
	public static String getTime() {
		Calendar calendar = Calendar.getInstance();
		Date time = calendar.getTime();
		SimpleDateFormat dformat = new SimpleDateFormat("yyyyMMddHHmmss");
		return dformat.format(time);
	}

	/**
	 * 判断SD卡是否存在, 如果存在返回SD卡路径 , 如果不存在返回路径为空
	 *
	 * @return
	 */
	public static String getSDPath() {
		boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
		if (sdCardExist) {
			File sdDir = Environment.getExternalStorageDirectory();
			return sdDir.toString();
		}
		return "";
	}



	/**
	 * 调用系统功能重新扫描指定的文件夹,写入系统媒体数据库
	 * 
	 * @author xnjiang
	 * @param context
	 * @param strFileName
	 * @since v0.0.1
	 */
	public static void scanMediaFileDataBase(Context context, String strFileName) {
		// 通常在我们的项目中，可能会遇到写本地文件，最常用的就是图片文件，在这之后需要通知系统重新扫描SD卡，
		// 在Android4.4之前也就是以发送一个Action为“Intent.ACTION_MEDIA_MOUNTED”的广播通知执行扫描。如下：

		// context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
		// Uri.parse("file://" + strRefreshDir)));

		// 但在Android4.4中，则会抛出以下异常：
		// W/ActivityManager( 498): Permission Denial: not allowed to send
		// broadcast android.intent.action.MEDIA_MOUNTED from pid=2269,
		// uid=20016
		// 那是因为Android4.4中限制了系统应用才有权限使用广播通知系统扫描SD卡。
		// 解决方式：
		// 使用MediaScannerConnection执行具体文件或文件夹进行扫描。
		// MediaScannerConnection.scanFile(context, new
		// String[]{Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath()
		// + "/" + strFileName}, null, null);

		// 判断目录如果是文件，就获取其上一级路径也进行刷新
		String strFileParent = new File(strFileName).isFile() ? new File(strFileName).getParentFile().getPath() : strFileName;
		MediaScannerConnection.scanFile(context, new String[] { strFileName, strFileParent }, null, null);
	}

	/**
	 * 复制文件到目标文件夹
	 */
	public static boolean copy(String srcPath, String destPath) {
		try {
			File file = new File(destPath);
			if (!file.exists()) {
				if (!file.getParentFile().exists()) {
					file.getParentFile().mkdirs();
				}
				file.createNewFile();
			}

			FileInputStream fis = new FileInputStream(srcPath);
			FileOutputStream fos = new FileOutputStream(destPath);

			int size = 0;
			byte[] buf = new byte[1024];
			while ((size = fis.read(buf)) != -1)
				fos.write(buf, 0, size);

			fos.close();
			fis.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 检测SDcard是否存在
	 *
	 * @return
	 */
	public static boolean isExistSDcard() {
		String state = Environment.getExternalStorageState();
		if (state.equals(Environment.MEDIA_MOUNTED))
			return true;
		else {
			return false;
		}
	}

	/**
	 * 获取拍照照片的存储路径
	 */
	public static String getDataPath() {
		String path;
		if (isExistSDcard())
			path = BaseApplication.mAppContext.getExternalCacheDir().getPath() + "/" + "jy_photo";
		else
			path = BaseApplication.mAppContext.getFilesDir().getPath();
		if (!path.endsWith("/"))
			path = path + "/" + "jy_photo" + "/";
		return path;
	}

	/**
	 *  在app默认缓存路径下提供一个文件名
	 * @return
	 */
	public static String getAppCacheDirWithSuffix(Context context,String suffixName) {
		try{
			String path;
			if (isExistSDcard()) {
				path = context.getExternalCacheDir().getPath();
			}else {
				path = context.getCacheDir().getPath();
			}
			if (!path.endsWith("/"))
				path = path + "/"+suffixName;
			return path;
		}catch (Exception e){
			return "";
		}
	}

	public static boolean isValiedFile(String path) {
		File file = new File(path);
		if(!file.exists()||file.length()==0||!file.isFile()){
			return false;
		}
		return true;
	}
}
